/*
 * @Author: mengxianwei mxw1@meitu.com
 * @Date: 2024-09-06 19:50:26
 * @LastEditors: mengxianwei mxw1@meitu.com
 * @LastEditTime: 2024-09-14 09:19:00
 *
 * @Description:
 * 美图云修QT 组件规范化 --- Tooltip 文字提示
 *
 * 简单的文字提示气泡框
 *
 * 支持指定气泡环绕优先位置
 *
 * https://www.figma.com/design/vjkWdi8640RkIEpKCDG9X7/%E7%BE%8E%E5%9B%BE%E4%BA%91%E4%BF%AEQT-%E7%BB%84%E4%BB%B6%E8%A7%84%E8%8C%83%E5%8C%96?node-id=574-10379&node-type=FRAME&t=M8SnvdVaboaPnm7y-0
 */

#ifndef BASICCONTROLS_MTRIANGLETOOLTIP_H
#define BASICCONTROLS_MTRIANGLETOOLTIP_H

#include <QHBoxLayout>
#include <QLabel>
#include <QPainterPath>
#include <QWidget>

class MShapedFrame;

class MTriangleToolTip : public QWidget
{
    Q_OBJECT

  public:
    // 气泡环绕控件位置
    enum ToolTipPosition
    {
        POS_LEFT,   // 控件左侧
        POS_TOP,    // 控件顶部
        POS_RIGHT,  // 控件右侧
        POS_BOTTOM, // 控件底部
    };

    /**
     * @description: 创建文字提示气泡框对象
     * @param {QWidget} *parent 父窗口指针
     * @return {*}
     */
    explicit MTriangleToolTip(QWidget *parent = nullptr);

    /**
     * @description: 设置气泡框最大宽度， 默认 400px
     * @param {int} width 最大宽度
     * @return {*}
     */
    void setToolTipMaxWidth(int width);

    /**
     * @description: 色湖之气泡框与控件间的距离， 默认 - 10px
     * @param {int} distance 距离
     * @return {*}
     */
    void setToolTipDistance(int distance);

    /**
     * @description: 设置气泡框环绕控件的优先位置
     * @param {ToolTipPosition} pos 环绕位置
     * @return {*}
     */
    void setToolTipPosition(ToolTipPosition pos);

    /**
     * @description:             设置气泡文字内容
     * @param {QString} &content 文字内容
     * @return {*}
     */
    void setToolTipContent(const QString &content, bool isHtml = false);

    /**
     * @description:            显示气泡框并自动调整气泡框显示位置
     * @param {QWidget} *widget 需要展示气泡的框的控件
     * @return {*}
     */
    void showAndAutoAdjustPos(const QWidget *widget);

    /**
     * @description:           显示气泡框并自动调整气泡框显示位置
     * @param {QRect} &screen  需要弹出气泡框的控件所在的屏幕矩形
     * @param {QPoint} &gPoint 需要弹出气泡框的控件的左上角的屏幕坐标
     * @param {int} width      需要弹出气泡框的控件的宽度
     * @param {int} height     需要弹出气泡框的控件的高度
     * @return {*}
     */
    void showAndAutoAdjustPos(const QRect &screen, const QPoint &gPoint, int width, int height);

  private:
    QPoint calculatedTipPos(const QRect &screen, const QPoint &globalPoint, int width, int height, const QSize &tipSize);

  private:
    QHBoxLayout *rootLayout_{};
    QHBoxLayout *frameLayout_{};
    MShapedFrame *frameBackground_{};
    QLabel *labelContent_{};

    int toolTipMaxWidth_;
    int toolTipDistance_;
    ToolTipPosition toolTipPos_;
    QString tipContent_;
};

#endif // BASICCONTROLS_MTRIANGLETOOLTIP_H
